package ar.uba.fi.algo3.algoflight.view;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

import ar.uba.fi.algo3.algoflight.controller.EscuchadorAlgoFlight;
import ar.uba.fi.algo3.algoflight.model.Posicion;
import ar.uba.fi.algo3.algoflight.model.juego.Escenario;
import ar.uba.fi.algo3.algoflight.model.juego.NivelDeDificultad;
import ar.uba.fi.algo3.algoflight.model.pistas.Helipuerto;
import ar.uba.fi.algo3.algoflight.model.pistas.Pista;
import ar.uba.fi.algo3.algoflight.model.pistas.PistaLarga;
import ar.uba.fi.algo3.algoflight.model.pistas.PistaSimple;
import ar.uba.fi.algo3.algoflight.model.utils.Constantes;
import fiuba.algo3.titiritero.dibujables.SuperficiePanel;
import fiuba.algo3.titiritero.modelo.GameLoop;
import fiuba.algo3.titiritero.modelo.SuperficieDeDibujo;

public class VentanaPrincipal {

	private JFrame frame;
	private GameLoop gameLoop;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					VentanaPrincipal window = new VentanaPrincipal();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public VentanaPrincipal() {
		try {
			initialize();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * Initialize the contents of the frame.
	 * 
	 * @throws IOException
	 */
	private void initialize() throws IOException {
		frame = new JFrame();
		frame.setForeground(new Color(0, 0, 0));
		frame.setBounds(100, 100, Constantes.ANCHO_ESCENARIO + 100,
				Constantes.ALTO_ESCENARIO + 100);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);

		JButton btnIniciar = new JButton("Iniciar");
		btnIniciar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				gameLoop.iniciarEjecucion();
			}
		});
		btnIniciar.setBounds(42, 16, 77, 25);
		frame.getContentPane().add(btnIniciar);

		JButton btnDetener = new JButton("Detener");
		btnDetener.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				gameLoop.detenerEjecucion();
			}
		});
		btnDetener.setBounds(325, 16, 92, 25);
		frame.getContentPane().add(btnDetener);

		JPanel panel = new SuperficiePanel();
		panel.setBackground(new Color(0, 0, 0));
		panel.setBounds(42, 53, Constantes.ANCHO_ESCENARIO,
				Constantes.ALTO_ESCENARIO);
		frame.getContentPane().add(panel);

		NivelDeDificultad nivelDeDificultad = new NivelDeDificultad(1);

		final Escenario escenario = new Escenario(nivelDeDificultad);

		Posicion posPistaSimple = new Posicion(575, 215);
		List<Posicion> coordenadasDeAterrizajePS = new ArrayList<Posicion>();
		Posicion coordenadaDeAterrizajePS = new Posicion(585, 165);
		coordenadasDeAterrizajePS.add(coordenadaDeAterrizajePS);
		Pista pistaSimple = new PistaSimple(posPistaSimple,
				coordenadasDeAterrizajePS);
		pistaSimple.setRotacion(45);

		Posicion posPistaLarga = new Posicion(300, 253);
		List<Posicion> coordenadasDeAterrizajePL = new ArrayList<Posicion>();
		Posicion coordenadaDeAterrizajePL = new Posicion(305, 260);
		coordenadasDeAterrizajePL.add(coordenadaDeAterrizajePL);
		Pista pistaLarga = new PistaLarga(posPistaLarga,
				coordenadasDeAterrizajePL);

		Posicion posHelipuerto = new Posicion(540, 315);
		List<Posicion> coordenadasDeAterrizajeH = new ArrayList<Posicion>();
		Posicion coordenadaDeAterrizajeH = new Posicion(568, 307);
		coordenadasDeAterrizajeH.add(coordenadaDeAterrizajeH);
		Pista helipuerto = new Helipuerto(posHelipuerto,
				coordenadasDeAterrizajeH);

		escenario.agregarPista(pistaLarga);
		escenario.agregarPista(pistaSimple);
		escenario.agregarPista(helipuerto);

		VistaEscenario vistaEscenario = new VistaEscenario(escenario,
				Constantes.RUTA_IMAGEN_ESCENARIO_1);

		this.gameLoop = new GameLoop((SuperficieDeDibujo) panel);
		this.gameLoop.agregar(vistaEscenario);
		this.gameLoop.agregar(escenario);

		EscuchadorAlgoFlight escuchadorAlgoFlight = new EscuchadorAlgoFlight(
				escenario);

		panel.addMouseListener(escuchadorAlgoFlight);

		frame.setFocusable(true);
		btnDetener.setFocusable(false);
		btnIniciar.setFocusable(false);

		frame.addKeyListener(escuchadorAlgoFlight);

	}
}
